package lt390

/*
390. 消除游戏
列表 arr 由在范围 [1, n] 中的所有整数组成，并按严格递增排序。请你对 arr 应用下述算法：

从左到右，删除第一个数字，然后每隔一个数字删除一个，直到到达列表末尾。
重复上面的步骤，但这次是从右到左。也就是，删除最右侧的数字，然后剩下的数字每隔一个删除一个。
不断重复这两步，从左到右和从右到左交替进行，直到只剩下一个数字。
给你整数 n ，返回 arr 最后剩下的数字。

   // 从左到右一定要消除第一个, 此时剩下的数组里的第一个要加一个step
// 比如1 2 3 4 ... 9, 从左到右消除后第一个是2, 此时的2由first+step=1+1得来, 此时剩下的数是
// 2 4 6 8, first=2, step=1*2=2, 此时从右往左消除得到的第一个剩下的数first还是2, step=4, 
// 因为剩下了 2 6. 再从左往右消除一定消除第一个, 此时first=first+step=2+4=6, 剩下的数只有1个, 于是返回
// first   要注意的是, 对于从右往左奇数长度的时候会消除第一个, 因此要考虑
*/
func lastRemaining(n int) int {
	//有规律
	remain := n
	flag := true
	res := 1
	step := 1
	for remain > 1 {
		// flag表示顺序
		if flag || remain%2 == 1 {
			//从左到右且为奇数
			res += step
		}
		flag = !flag
		step *= 2
		remain /= 2
	}
	return res
}

/*
1: nil
2: 2
3: 2
4: 2
5: 2
6: 4
7: 4
8： 6
9： 6
*/